package com.zqq.aidldemo;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView check, get;
    private EditText editText, editText2;

    IBinder mRemote;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        check = findViewById(R.id.checkBookInfo);
        get = findViewById(R.id.getBookList);
        editText = findViewById(R.id.editText);
        editText2 = findViewById(R.id.editText2);

        check.setOnClickListener(this);
        get.setOnClickListener(this);

        Intent intent = new Intent();
//        Android5.0中service的intent一定要显性声明【一种方法】
        intent.setAction("com.zqq.aidldemo.MY_ACTION");//隐士意图

//        隐式调用是除了设置setAction()外，还需要设置setPackage();【另一种方法】
        intent.setPackage("com.zqq.aidldemo"); //this.getPackageName()

        //开启LIbraryService的前台Service
        bindService(intent, conn, BIND_AUTO_CREATE);
    }


    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("*******************服务已经连接！！！");
            //保存远程返回的IBinder
            mRemote = service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("*******************服务关闭连接！！");
        }
    };


    @Override
    public void onClick(View v) {
        int idx = v.getId();
        //查询图书
        if (idx == R.id.checkBookInfo) {
            try {
                //请求查询图书的远程服务，并将请求结果显示在EditText上
                String t1 = checkBookInfo();
                if (!TextUtils.isEmpty(t1)) {
                    editText.setText(t1);
                } else {
                    editText.setText("结果是空的！");
                }
            } catch (Exception e) {
                System.out.println("查询图书异常：=" + e.toString());
            }
        }

        //获取图书列表
        if (idx == R.id.getBookList) {
            try {
                //请求列表的远程服务
                String t1 = getBookList();
                if (!TextUtils.isEmpty(t1)) {
                    editText2.setText(t1);
                } else {
                    editText2.setText("结果空！");
                }
            } catch (Exception e) {
                System.out.println("列表异常：=" + e.toString());
            }
        }
    }


    /**
     * 请求 查询图书信息 远程服务的实现逻辑
     */
    private String checkBookInfo() throws RemoteException {
        //_data客户端【发送给】远程服务端的数据载体
        Parcel _data = Parcel.obtain();

        //_reply客户端【接收】远程服务端的数据的载体
        Parcel _reply = Parcel.obtain();

        String result = "";
        try {
            //设置token【不是网络请求时的token令牌】
            _data.writeInterfaceToken("token10086");

            //将传输给远程端的数据 设置在_data上
            String bookName = editText.getText().toString();
            if (!TextUtils.isEmpty(bookName)) {
                _data.writeInt(1);
                _data.writeString(bookName);
            } else {
                _data.writeInt(0);
            }

            //底层是通过NativeBinder框架与远程服务端交互，
            //会导致远程服务端的Binder的onTransact方法被调用
            //这一点很重要，分析远程端要用到，请记住
            mRemote.transact(IBinder.FIRST_CALL_TRANSACTION + 0, _data, _reply, 0);

            _reply.readException();

            //读取远程端返回的数据
            result = _reply.readString();

        } finally {
            _data.recycle();
            _reply.recycle();
        }
        return result;
    }


    /**
     * 请求“获取图书列表”远程服务的实现逻辑
     */
    private String getBookList() throws RemoteException {
        //_data客户端【发送给】远程服务端的数据载体
        Parcel _data = Parcel.obtain();

        //_reply客户端【接收】远程服务端的数据的载体
        Parcel _reply = Parcel.obtain();
        String result = "";
        try {
            //设置token【不是网络请求时的token令牌】
            _data.writeInterfaceToken("token10000");
            _data.writeInt(1);

            //底层是通过NativeBinder框架与远程服务端交互，
            //会导致远程服务端的Binder的onTransact方法被调用
            mRemote.transact(IBinder.FIRST_CALL_TRANSACTION + 1, _data, _reply, 0);

            _reply.readException();
            //读取远程端返回的数据
            result = _reply.readString();

        } finally {
            _data.recycle();
            _reply.recycle();
        }
        return result;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(conn);
    }

}
